package com.itzdm.ai.service.impl;


import com.itzdm.ai.config.AppConfig;
import com.itzdm.ai.model.ChatContext;
import com.itzdm.ai.model.ChatMessage;
import com.itzdm.ai.service.ChatContextService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * 聊天上下文服务实现类
 */
@Service
public class ChatContextServiceImpl implements ChatContextService {

    private static final String CHAT_CONTEXT_KEY_PREFIX = "chat:context:";
    // 默认过期时间为30分钟
    private static final long DEFAULT_EXPIRATION = 30;

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    @Autowired
    private AppConfig appConfig;

    private static final Logger log = LoggerFactory.getLogger(ChatContextServiceImpl.class);

    /**
     * 应用启动时初始化系统消息
     */
    @PostConstruct
    public void init() {
        // 遍历所有用户，设置默认系统消息
        // 由于Redis中的用户是动态生成的，这里只在新用户创建ChatContext时设置系统消息
        String defaultSystemMessage = appConfig.getDefaultSystemMessage();
        if (defaultSystemMessage != null && !defaultSystemMessage.trim().isEmpty()) {
            log.info("应用启动，默认系统消息已配置: {}", defaultSystemMessage);
        }
    }

    /**
     * 生成Redis中的Key
     */
    private String getRedisKey(Long userId) {
        return CHAT_CONTEXT_KEY_PREFIX + userId;
    }


    /**
     * 通过用户id获得redis中的用户上下文
     * @param userId 用户ID
     * @return
     */
    @Override
    public ChatContext getChatContext(Long userId) {
        // 首先需要获得指定用户的redisKey
        String redisKey = getRedisKey(userId);
        // 然后从Redis中获取聊天上下文
        ChatContext chatContext = (ChatContext) redisTemplate.opsForValue().get(redisKey);
        // 判断是否存在
        if (chatContext == null) {
            chatContext = ChatContext.builder()
                    .userId(userId)
                    .messageHistory(new ArrayList<>())
                    .build();
            // 该用户为新加入ai的用户,需要设置系统信息
            String defaultSystemMessage = appConfig.getDefaultSystemMessage();
            chatContext.addSystemMessage(defaultSystemMessage);
            // 保存到Redis
            saveChatContext(chatContext);
        }
        return chatContext;
    }


    /**
     * 保存聊天上下文到Redis
     * @param chatContext 聊天上下文
     */
    @Override
    public void saveChatContext(ChatContext chatContext) {
        if (chatContext == null) {
            return;
        }
        String redisKey = getRedisKey(chatContext.getUserId());
        // 直接进行保存就可以，因为配置了redis的存储
        redisTemplate.opsForValue().set(redisKey,chatContext,DEFAULT_EXPIRATION, TimeUnit.MINUTES);
    }

    @Override
    public ChatContext addUserMessage(Long userId, String content) {
        ChatContext chatContext = getChatContext(userId);
        chatContext.addUserMessage(content);
        // 由于是同一个对象，所以直接保存就可以，可以覆盖redis中的对象
        saveChatContext(chatContext);
        return chatContext;
    }

    @Override
    public ChatContext addAssistantMessage(Long userId, String content) {
        ChatContext chatContext = getChatContext(userId);
        chatContext.addAssistantMessage(content);
        saveChatContext(chatContext);
        return chatContext;
    }

    @Override
    public ChatContext addAssistantMessageWithReasoning(Long userId, String content, String reasoningContent) {
        ChatContext chatContext = getChatContext(userId);
        chatContext.addAssistantMessageWithReasoning(content, reasoningContent);
        saveChatContext(chatContext);
        return chatContext;
    }

    @Override
    public List<ChatMessage> getMessageHistory(Long userId) {
        ChatContext chatContext = getChatContext(userId);
        return chatContext.getMessageHistory();
    }

    @Override
    public void clearChatContext(Long userId) {
        String key = getRedisKey(userId);
        redisTemplate.delete(key);
    }

    @Override
    public ChatContext setSystemMessage(Long userId, String content) {
        ChatContext chatContext = getChatContext(userId);
        chatContext.addSystemMessage(content);
        saveChatContext(chatContext);
        return chatContext;
    }
} 